bitkeeper revision 1.1159.251.1 (4208dde2yO5a2hmuPJlwJg0U4vM8yA)
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Tue, 8 Feb 2005 15:42:26 +0000 (15:42 +0000)
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Tue, 8 Feb 2005 15:42:26 +0000 (15:42 +0000)
Use p_paddr when loading Elf program segments; not p_vaddr.
Signed-off-by: keir.fraser@cl.cam.ac.uk
tools/libxc/xc_linux_build.c
tools/libxc/xc_vmx_build.c
xen/common/elf.c

index dd903751a92490bf391c483e8a9a077a068e177a..c75a0837b7c57daa799235fed66de16a1c0ecfbe 100644 (file)
@@ -558,10 +558,10 @@ static int parseelfimage(char *elfbase,
         phdr = (Elf_Phdr *)(elfbase + ehdr->e_phoff + (h*ehdr->e_phentsize));
         if ( !is_loadable_phdr(phdr) )
             continue;
-        if ( phdr->p_vaddr < kernstart )
-            kernstart = phdr->p_vaddr;
-        if ( (phdr->p_vaddr + phdr->p_memsz) > kernend )
-            kernend = phdr->p_vaddr + phdr->p_memsz;
+        if ( phdr->p_paddr < kernstart )
+            kernstart = phdr->p_paddr;
+        if ( (phdr->p_paddr + phdr->p_memsz) > kernend )
+            kernend = phdr->p_paddr + phdr->p_memsz;
     }
 
     if ( (kernstart > kernend) || 
@@ -611,7 +611,7 @@ loadelfimage(
         
         for ( done = 0; done < phdr->p_filesz; done += chunksz )
         {
-            pa = (phdr->p_vaddr + done) - vstart;
+            pa = (phdr->p_paddr + done) - vstart;
             va = xc_map_foreign_range(
                 xch, dom, PAGE_SIZE, PROT_WRITE, parray[pa>>PAGE_SHIFT]);
             chunksz = phdr->p_filesz - done;
@@ -624,7 +624,7 @@ loadelfimage(
 
         for ( ; done < phdr->p_memsz; done += chunksz )
         {
-            pa = (phdr->p_vaddr + done) - vstart;
+            pa = (phdr->p_paddr + done) - vstart;
             va = xc_map_foreign_range(
                 xch, dom, PAGE_SIZE, PROT_WRITE, parray[pa>>PAGE_SHIFT]);
             chunksz = phdr->p_memsz - done;
index aaae52f0c5ba2b0c656a55d3d2603c7695748d04..4ccc274c6819a410fd4b2e221c774d121964f4c0 100644 (file)
@@ -629,10 +629,10 @@ static int parseelfimage(char *elfbase,
         phdr = (Elf_Phdr *)(elfbase + ehdr->e_phoff + (h*ehdr->e_phentsize));
         if ( !is_loadable_phdr(phdr) )
             continue;
-        if ( phdr->p_vaddr < kernstart )
-            kernstart = phdr->p_vaddr;
-        if ( (phdr->p_vaddr + phdr->p_memsz) > kernend )
-            kernend = phdr->p_vaddr + phdr->p_memsz;
+        if ( phdr->p_paddr < kernstart )
+            kernstart = phdr->p_paddr;
+        if ( (phdr->p_paddr + phdr->p_memsz) > kernend )
+            kernend = phdr->p_paddr + phdr->p_memsz;
     }
 
     if ( (kernstart > kernend) || 
@@ -676,7 +676,7 @@ loadelfimage(
         
         for ( done = 0; done < phdr->p_filesz; done += chunksz )
         {
-            pa = (phdr->p_vaddr + done) - vstart - LINUX_PAGE_OFFSET;
+            pa = (phdr->p_paddr + done) - vstart - LINUX_PAGE_OFFSET;
             va = xc_map_foreign_range(
                 xch, dom, PAGE_SIZE, PROT_WRITE, parray[pa>>PAGE_SHIFT]);
             chunksz = phdr->p_filesz - done;
@@ -689,7 +689,7 @@ loadelfimage(
 
         for ( ; done < phdr->p_memsz; done += chunksz )
         {
-            pa = (phdr->p_vaddr + done) - vstart - LINUX_PAGE_OFFSET;
+            pa = (phdr->p_paddr + done) - vstart - LINUX_PAGE_OFFSET;
             va = xc_map_foreign_range(
                 xch, dom, PAGE_SIZE, PROT_WRITE, parray[pa>>PAGE_SHIFT]);
             chunksz = phdr->p_memsz - done;
index 7c94dab5e21ba0d08e3f96448ef688584c92d00d..685d733e56857be57a79feee13af455cc8673c42 100644 (file)
 
 #ifdef CONFIG_X86
 #define FORCE_XENELF_IMAGE 1
-#define ELF_ADDR           p_vaddr
 #elif defined(__ia64__)
 #define FORCE_XENELF_IMAGE 0
-#define ELF_ADDR           p_paddr
 #endif
 
 static inline int is_loadable_phdr(Elf_Phdr *phdr)
@@ -100,10 +98,10 @@ int parseelfimage(char *elfbase,
         phdr = (Elf_Phdr *)(elfbase + ehdr->e_phoff + (h*ehdr->e_phentsize));
         if ( !is_loadable_phdr(phdr) )
             continue;
-        if ( phdr->ELF_ADDR < kernstart )
-            kernstart = phdr->ELF_ADDR;
-        if ( (phdr->ELF_ADDR + phdr->p_memsz) > kernend )
-            kernend = phdr->ELF_ADDR + phdr->p_memsz;
+        if ( phdr->p_paddr < kernstart )
+            kernstart = phdr->p_paddr;
+        if ( (phdr->p_paddr + phdr->p_memsz) > kernend )
+            kernend = phdr->p_paddr + phdr->p_memsz;
     }
 
     if ( (kernstart > kernend) || 
@@ -144,10 +142,10 @@ int loadelfimage(char *elfbase)
         if ( !is_loadable_phdr(phdr) )
             continue;
         if ( phdr->p_filesz != 0 )
-            memcpy((char *)phdr->ELF_ADDR, elfbase + phdr->p_offset, 
+            memcpy((char *)phdr->p_paddr, elfbase + phdr->p_offset, 
                    phdr->p_filesz);
         if ( phdr->p_memsz > phdr->p_filesz )
-            memset((char *)phdr->ELF_ADDR + phdr->p_filesz, 0, 
+            memset((char *)phdr->p_paddr + phdr->p_filesz, 0, 
                    phdr->p_memsz - phdr->p_filesz);
     }